# -*- coding: utf-8 -*-

from Tkinter import *
import tkMessageBox
import xmlrpclib
import sys
import os

"""
import tkFileDialog
import pickle
"""
        
"""
Numero serveur 11501 pour B52equip1
"""

class Controleur:
    def __init__(self):             
        self.serveur =None
        self.BaseDonnees = None
        self.vue=None
        self.Demarre()
        pass
        
    def Demarre(self):
        self.vue=VueClient()
#        root=Tk()
#        root.geometry('800x600')
#        self.initServeur("localhost:8000")
#        self.vue = Vue_Enregistrement(root,self)
#        root.mainloop()
        self.vue.Mainloop(self,800,600)
        pass
        
    def initServeur(self,NomServeur):
        Serveur='http://'+NomServeur
        self.serveur=xmlrpclib.ServerProxy(Serveur)
        pass 
     
    def ChargerVue(self,NomVue):        
        " Recuperation de la vue depuis le serveur"
        LaVue=self.serveur.RecevoirVue(NomVue)
        " Enregistrement des donnees localement"
        " Toutjours sous le nom de <NomVue>.py"
        f=open(NomVue+'.py','wb')       
        f.writelines(LaVue)
        f.close()
        pass
    
class VueClient(object):
    def __init__(self):
        self.Vue_CreationTable=None
        self.Vue_EditionTable=None
        self.Vue_Initialisation=None
        self.VueActive=None
        self.Vue_Login=None
        self.Vue_Enregistrement=None
        self.Vue_ReglesAffaires=None
        self.Vue_SaisieClient = None
        self.Vue_SaisieChamp = None
        pass
    
    def Mainloop(self,parent,width,height):
        self.parent=parent
        self.root=Tk()
        self.x=self.root.winfo_screenwidth()/2-(width/2)
        self.y=self.root.winfo_screenheight()/2-(height/2)       
        self.root.geometry(str(width)+'x'+str(height)+'+'+str(self.x)+'+'+str(self.y))
        self.root.config(bg='#046380')
        self.root.title("PERP")
        self.root.protocol('WM_DELETE_WINDOW',self.Quitter)
        self.menuPrincipal()
        self.root.mainloop()
        pass
        
    def __del__(self):
        del self.Vue_CreationTable
        del self.Vue_EditionTable
        del self.VueActive
        del self.Vue_Login 
        del self.Vue_Enregistrement
        try:
            os.remove('Vue_EditionTable.py')
        except: 0 
        try:
            os.remove('Vue_Enregistrement.py')
        except: 0
        try:
            os.remove('Vue_CreationTable.py')
        except: 0
        pass
    
    def menuPrincipal(self):
        self.menu = Menu(self.root)
        self.root.config(menu=self.menu)

        listeMenu=["Fichier"]

        self.barreMenu=[]
        for i in range(8):
            self.barreMenu.append(Menu(self.menu, tearoff=0))
        for i in range(len(listeMenu)):
            self.menu.add_cascade(label=listeMenu[i], menu=self.barreMenu[i])
        self.menuBD=Menu(self.menu,tearoff=0)
        self.menuBD.add_command(label='Initialisation des table',command=self.Initialisation,state='disabled')
        self.menuBD.add_command(label='Créer une table',command=self.CreationTable,state='disabled')
        self.menuBD.add_command(label='Éditer une table',command=self.EditionTable,state='disabled')
        self.menuBD.add_command(label='Éditer les enregistremesnt',command=self.Enregistrement,state='disabled')
        self.menuBD.add_command(label='Éditer les règles daffaire',command=self.ReglesAffaires, state = 'disabled')
        self.menuBD.add_command(label='Saisie de données',command=self.SaisieChamps, state = 'disabled')
        self.menuBD.add_command(label='Saisie de données (exemple Employé)',command=self.SaisieClient, state = 'disabled')
        self.menu.add_cascade(label="Base de données",menu=self.menuBD)
        self.menuAide=Menu(self.menu,tearoff=0)
        self.menu.add_cascade(label="Aide",menu=self.menuAide)
        self.menuAide.add_command(label='À propos',command=None,state='disabled')
        self.barreMenu[0].add_command(label="Connexion", command=self.Connexion)
        self.barreMenu[0].add_command(label="Deconnexion", command=self.Deconnexion,state='disabled')
        self.barreMenu[0].add_command(label="Connexion Rapide", command=self.ConnexionRapide)
        self.barreMenu[0].add_separator()

        self.barreMenu[0].add_command(label="Quitter", command=self.Quitter)
        
    def ConnexionRapide(self):
        self.parent.initServeur('localhost:8000')
        self.parent.vue.barreMenu[0].entryconfigure ( 0, state='disabled')
        self.parent.vue.barreMenu[0].entryconfigure ( 1, state='normal')
        self.parent.vue.menuBD.entryconfigure ( 0, state='normal')
        self.parent.vue.menuBD.entryconfigure ( 1, state='normal')
        self.parent.vue.menuBD.entryconfigure ( 2, state='normal')
        self.parent.vue.menuBD.entryconfigure ( 3, state='normal')
        self.parent.vue.menuBD.entryconfigure ( 4, state='normal')
        self.parent.vue.menuBD.entryconfigure ( 5, state='normal')
        self.parent.vue.menuBD.entryconfigure ( 6, state='normal')
        
    def ReglesAffaires(self):
        if (self.Vue_ReglesAffaires == None):
            self.parent.ChargerVue('Vue_ReglesAffaires')
            self.Vue_ReglesAffaires= __import__('Vue_ReglesAffaires')
        if (self.VueActive!=None):
            self.VueActive.destroy()
            self.VueActive=None     
        self.VueActive = self.Vue_ReglesAffaires.Vue_ReglesAffaires(self.root,self.parent,width=400,height=300)       
        pass
    
    def SaisieChamps(self):
        if (self.Vue_SaisieChamp == None):
            self.parent.ChargerVue('Vue_SaisieChamps')
            self.Vue_SaisieChamp= __import__('Vue_SaisieChamps')
        if (self.VueActive!=None):
            self.VueActive.destroy()
            self.VueActive=None     
        self.VueActive = self.Vue_SaisieChamp.VueSaisieChamps(self.root,self.parent,width=400,height=300)       
        pass
    
    def Initialisation(self):
        if (self.Vue_Initialisation ==None):
            self.parent.ChargerVue('Vue_Initialisation')
            self.Vue_Initialisation = __import__('Vue_Initialisation')
        if (self.VueActive!=None):
            self.VueActive.destroy()
            self.VueActive=None     
        self.VueActive = self.Vue_Initialisation.VueInitialisation(self.root,self.parent,width=400,height=300)       
        pass

    def EditionTable(self):
        if (self.Vue_EditionTable ==None):
            self.parent.ChargerVue('Vue_EditionTable')
            self.Vue_EditionTable = __import__('Vue_EditionTable')
        if (self.VueActive!=None):
            self.VueActive.destroy()
            self.VueActive=None     
        self.VueActive = self.Vue_EditionTable.VueEditionTable(self.root,self.parent)       
        pass
    
    def SaisieClient(self):
        if (self.Vue_SaisieClient ==None):
            self.parent.ChargerVue('Vue_SaisieClient')
            self.Vue_SaisieClient = __import__('Vue_SaisieClient')
        if (self.VueActive!=None):
            self.VueActive.destroy()
            self.VueActive=None     
        self.VueActive = self.Vue_SaisieClient.VueClient(self.root,self.parent)       
        pass

    def Enregistrement(self):
        if (self.Vue_Enregistrement ==None):
            self.parent.ChargerVue('Vue_Enregistrement')
            self.Vue_Enregistrement= __import__('Vue_Enregistrement')
        if (self.VueActive!=None):
            self.VueActive.destroy()
            self.VueActive=None
        self.VueActive = self.Vue_Enregistrement.Vue_Enregistrement(self.root,self.parent,width=600,height=400)        
        pass
    
    def CreationTable(self):
        if (self.Vue_CreationTable ==None):
            self.parent.ChargerVue('Vue_CreationTable')
            self.Vue_CreationTable= __import__('Vue_CreationTable')
        if (self.VueActive!=None):
            self.VueActive.destroy()
            self.VueActive=None
        self.VueActive = self.Vue_CreationTable.VueCreationTable(self.root,self.parent)        
        pass

    def Connexion(self):
        if (self.Vue_Login==None):
            self.Vue_Login= __import__('Vue_Login')
            self.VueActive = self.Vue_Login.Login(self.root,self.parent,width=400,height=200)                
        pass

    def Deconnexion(self):
        "Fermer la connection"
        self.parent.vue.barreMenu[0].entryconfigure ( 0, state='normal')
        self.barreMenu[0].entryconfigure ( 1, state='disabled')
        self.menuBD.entryconfigure ( 0, state='disabled')
        self.menuBD.entryconfigure ( 1, state='disabled')
        self.menuBD.entryconfigure ( 2, state='disabled')
        self.menuBD.entryconfigure ( 3, state='disabled')
        self.menuBD.entryconfigure ( 4, state='disabled')
        self.menuBD.entryconfigure ( 5, state='disabled')
        if (self.VueActive!=None):
            self.VueActive.destroy()
            self.VueActive=None       
        self.VueActive=None
        self.Vue_Login=None                    
        try:
            self.Vue_EditionTable=None
            os.remove('Vue_EditionTable.py')
        except: 0 
        try:
            self.Vue_Enregistrement=None
            os.remove('Vue_Enregistrement.py')
        except: 0
        try:
            self.Vue_CreationTable=None
            os.remove('Vue_CreationTable.py')
        except: 0
        pass
        try:
            self.Vue_Initialisation=None
            os.remove('Vue_Initialisation.py')
        except: 0
        pass

    
    def Quitter(self):
        if tkMessageBox.askyesno("Attention", "Vous voulez vraiment quitter ce programme?"):
            sys.exit(0)


if __name__ == '__main__':
        controleur=Controleur()



"""
Comment ajouter une vue

Ajouter votre vue dans le fichier Vues, dans le fichier Serveur

1-L'entête de votre fichier interface 

# -*- coding: utf-8 -*-
from tkGrid import *
import xmlrpclib
#import pickle
import tkMessageBox as msgBox
from BD_InterfaceBaseDonnees import *
try:
    from xTkinter import *
except:
    print >> sys.stderr, 'Le module xTkinter est  introuvable'  
    sys.exit(1)
import sys

2- __init__
class ***Nom de votre frame *** (Frame):
    def __init__(self,master,parent,**cnf):
        KeysList=cnf.keys()
        self.parent = parent
        self.master=master
        self.width=400
        self.height=200
        if ('width' in KeysList):
            self.width=cnf['width']
        if ('width' in KeysList):
            self.height=cnf['height']
        Frame.__init__(self,master,cnf)        
        self.master.update()
        self.x=self.master.winfo_width()/2-(self.width/2)
        self.y=self.master.winfo_height()/2-(self.height/2)       
        self.place(x=self.x,y=self.y)
        
3- Méthode à ajouter

    def repaint(self,evt):
        self.master.update()
        self.x=self.master.winfo_width()/2-(self.width/2)
        self.y=self.master.winfo_height()/2-(self.height/2)       
        self.place(x=self.x,y=self.y)
        pass
    
   def __del__(self):
        self.master.unbind('<Configure>')
        pass
        
    def close(self):
        self.destroy()
        pass
        
6- Ajouter la commande suivante
    self.menuBD.add_command(label=***Nom afficher dans le sous-menu***,command=self.***Nom de votre vue***, state = 'disabled')
   Dans la fonction  def menuPrincipal(self):
   du fichier Vue_Principal.pyw

7- Ajouter une fonction pour lancer votre vue dans le fichier Vue_Principal.pyw

def ***Nom de votre vue***(self):
        if (self.***Nom de votre vue*** ==None):
            self.parent.ChargerVue('***Nom de votre vue***')
            self.***Nom de votre vue***= __import__('***Nom de votre vue***')
        if (self.VueActive!=None):
            self.VueActive.destroy()
            self.VueActive=None
        self.VueActive = self.***Nom de votre vue***.***Nom de votre vue***(self.root,self.parent,width=600,height=400)        
        pass

8 - Dans la fonction def OKConnexionERP(self):
    du fichier Vue_Login.py, ajouter 
self.parent.vue.menuBD.entryconfigure ( **Prochain numéro**, state='normal')

"""